/*
 * Copyright (C) 2023, Inria
 * GRAPHDECO research group, https://team.inria.fr/graphdeco
 * All rights reserved.
 *
 * This software is free for non-commercial, research and evaluation use 
 * under the terms of the LICENSE.md file.
 *
 * For inquiries contact  george.drettakis@inria.fr
 */

#ifndef CUDA_RASTERIZER_BACKWARD_H_INCLUDED
#define CUDA_RASTERIZER_BACKWARD_H_INCLUDED

#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#define GLM_FORCE_CUDA
#include <glm/glm.hpp>

namespace BACKWARD
{
  void render(
    const dim3 grid, dim3 block,
    const uint2* ranges,
    const uint32_t* point_list,
    int W, int H, int ED,
    const float* bg_color,
    const float2* means2D,
    const float4* conic_opacity,
    const float* colors,
    const float* depths,
    const float* norms,
    const float* extras,
    const float* accum_alphas,
    const uint32_t* n_contrib,
    const float* dL_dpixels,
    const float* dL_dpixel_depths,
    const float* dL_dpixel_norms,
    const float* dL_dpixel_alphas,
    const float* dL_dpixel_extras,
    float3* dL_dmean2D,
    float4* dL_dconic2D,
    float* dL_dopacity,
    float* dL_dcolors,
    float* dL_ddepths,
    float* dL_dnorm3Ds,
    float* dL_dextras);

  void preprocess(
    int P, int D, int M,
    const float3* means,
    const int* radii,
    const float* shs,
    const bool* clamped,
    const glm::vec3* scales,
    const glm::vec4* rotations,
    const float scale_modifier,
    const float* cov3Ds,
    const glm::vec3* norm3Ds,
    bool is_norm3Ds_precomp,
    const float* view,
    const float* proj,
    const float focal_x, float focal_y,
    const float tan_fovx, float tan_fovy,
    const glm::vec3* campos,
    const float3* dL_dmean2D,
    const float* dL_dconics,
    glm::vec3* dL_dmeans,
    float* dL_dcolor,
    float* dL_ddepth,
    float* dL_dcov3D,
    glm::vec3* dL_dnorm3D,
    float* dL_dsh,
    glm::vec3* dL_dscale,
    glm::vec4* dL_drot);
}

#endif